package myzzyl.utils;


import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import lombok.extern.slf4j.Slf4j;
import myzzyl.domain.mapper.JwtUserMapper;
import myzzyl.domain.pojo.JwtUser;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Date;
import java.util.Map;

@Slf4j
public class JwtUtil {

    /**
     * 生成jwt令牌
     * @param secret 秘钥
     * @param claims 声明，一般用于存储一些非敏感的用户信息
     * @param expirationTime 过期时间
     * @return jwt令牌
     */
    public static String generateJwt(String secret, Map<String, Object> claims, Long expirationTime) {
        SecretKey secretKey = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
        Date time = new Date(System.currentTimeMillis() + expirationTime);
        return Jwts.builder()
                .claims(claims)
                .signWith(secretKey, Jwts.SIG.HS256)
                .expiration(time)
                .compact();

    }


    /**
     * 解析jwt令牌并转化为JwtUser对象
     * @param secret 秘钥
     * @param token 前端携带的令牌
     * @return JwtUser
     */
    public static JwtUser parseJwtToJwtUser(String secret, String token) {
        SecretKey secretKey = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
        // 获取声明
        Claims claims = Jwts.parser()
                .verifyWith(secretKey)
                .build()
                .parseSignedClaims(token)
                .getPayload();
        return JwtUserMapper.INSTANCE.mapFromClaims(claims);
    }


    /**
     * 校验jwt令牌是否有效
     * @param secret 秘钥
     * @param token 前端携带的令牌
     * @return 布尔值
     */
    public static boolean validateJwt(String secret, String token) {
        SecretKey secretKey = new SecretKeySpec(secret.getBytes(), "HmacSHA256");

        if (token == null) return false;
        try {
            Jwts.parser()
                    .verifyWith(secretKey)
                    .build()
                    .parseSignedClaims(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

}
